#!/usr/bin/env python
# -*- coding: UTF8 -*-

from GladeConnect import GladeConnect
import completion
import SimpleTree
import ifd
import gtk
import dialogos
import debugwindow
import sys
import comunes
from psycopg2 import connect
from strSQL.basicas import strSelectTipoControl
import treetohtml

(CODIGO_TIPO_CONTROL,
 DESCRIPCION_TIPO_CONTROL,
 TIPO_RESULTADO,
 CODIGO_UNIDAD,
 DESCRIPCION_UNIDAD)=range(5)

class wnTipoControl(GladeConnect):
    
    def __init__(self, conexion=None, padre=None, root="wnTipoControl"):
        GladeConnect.__init__(self,"glade/wnTipoControl.glade", root)
        self.cnx = conexion
        self.cursor = self.cnx.cursor()
        self.padre = padre
        if padre is None:
            self.wnTipoControl.maximize()
            self.frm_padre=self.wnTipoControl
        else:
            self.frm_padre = self.padre.frm_padre
            
        self.crea_columnas()
        
        self.carga_datos()
        
    def crea_columnas(self):
        columnas=[]
        columnas.append([CODIGO_TIPO_CONTROL, "Codigo", int])
        columnas.append([DESCRIPCION_TIPO_CONTROL, "Descripción Tipo Control", str])
        columnas.append([DESCRIPCION_UNIDAD, "Descripción Unidad", str])

        self.modelo=gtk.ListStore(int, str)
        SimpleTree.GenColsByModel(self.modelo, columnas, self.treeTipoControl)
        self.col_data = [x[0] for x in columnas]
        
    def on_btnImprimir_clicked(self, btn=None):
        t = treetohtml.TreeToHTML(self.treeTipoControl,"Tipo de Controles", self.col_data)
        t.show()        
    
    def carga_datos(self):
        self.modelo=ifd.ListStoreFromSQL(self.cnx, strSelectTipoControl)
        self.treeTipoControl.set_model(self.modelo)
    
    def on_treeTipoControl_row_activated(self, tree=None, patch=None, col=None):
        self.on_btnPropiedades_clicked()
        
    def on_btnAnadir_clicked(self, btn=None):
        dlg=dlgTipoControl(self.cnx, self.frm_padre, False)
        response=dlg.dlgTipoControl.run()
        dlg.editando=False
        if response == gtk.RESPONSE_OK:
            self.entDescripcion=dlg.entDescripcion.get_text()
            self.carga_datos()

    def on_btnQuitar_clicked(self, btn=None):
        model, it = self.treeTipoControl.get_selection().get_selected()
        if model is None or it is None:
            return
        codigo = model.get_value(it, CODIGO_TIPO_CONTROL)
        descripcion = model.get_value(it, DESCRIPCION_TIPO_CONTROL)
        
        if dialogos.yesno("Desea eliminar, <b>%s</b>, esta acción no se puede deshacer.\n ¿Esta Seguro de Eliminar?"%descripcion, self.frm_padre) == gtk.RESPONSE_YES:
            llaves = {'codigo_tipo_control':codigo}
            sql = ifd.deleteFromDict("traza.tipo_control",llaves)
            try:
                self.cursor.execute(sql, llaves)
                model.remove(it)
            except:
                print sys.exc_info()[1]
                dialogos.error("<b>NO SE PUEDE ELIMINAR</b>\nEl Tipo de Control <b>%s</b> se encuentra relacionado con el Módulo Control. "%descripcion)

    def on_btnPropiedades_clicked(self, btn=None):
        model, it = self.treeTipoControl.get_selection().get_selected()
        if model is None or it is None:
            return
        dlg = dlgTipoControl(self.cnx, self.frm_padre, False)
        dlg.entCodigo.set_text(model.get_value(it, CODIGO_TIPO_CONTROL))
        dlg.entDescripcion.set_text(model.get_value(it, DESCRIPCION_TIPO_CONTROL))
        dlg.TipoResultado = model.get_value(it, TIPO_RESULTADO)
        
        if dlg.TipoResultado == 'T':
            dlg.cmbTipoResultado.set_active(0)
        else:
            dlg.cmbTipoResultado.set_active(1)
        
        dlg.entUnidad.set_text(model.get_value(it, DESCRIPCION_UNIDAD))
        dlg.pecUnidad.set_selected(True)
        dlg.codigo_unidad = model.get_value(it, CODIGO_UNIDAD)
        dlg.editando = True
        response = dlg.dlgTipoControl.run()
        if response == gtk.RESPONSE_OK:
            self.modelo.clear()
            self.carga_datos()
        
        
    def on_btnCerrar_clicked(self, btn=None):
        if self.padre is None:
            self.on_exit()
        else:
            self.padre.remove_tab("Tipo Control")
            
class dlgTipoControl(GladeConnect):
    def __init__(self, conexion=None, padre=None, editando=False):
        GladeConnect.__init__(self, "glade/wnTipoControl.glade", "dlgTipoControl")
        self.dlgTipoControl.show_all()
        self.cnx=conexion
        self.cursor=self.cnx.cursor()
        self.dlgTipoControl.set_transient_for(padre)
        self.entDescripcion.grab_focus()
        self.editando=editando
        self.codigo_unidad = None
        self.cmbTipoResultado.set_active(1)
        self.pecUnidad = completion.CompletionUnidad(self.entUnidad,
                                self.sel_unidad,
                                self.cnx)
        self.dlgTipoControl.show()

    def sel_unidad(self, completion, model, iter):
        self.codigo_unidad = model.get_value(iter, 1)
    
    
    def on_btnAceptar_clicked(self, btn=None):
        if self.entDescripcion.get_text()=="":
            dialogos.error("El campo <b>Descripción</b> no puede estar vacio.")
            return
        if self.codigo_unidad is None:
            dialogos.error("El campo <b>Unidad</b> no puede estar vacío.")
            return
        
        active = self.cmbTipoResultado.get_active()
        if  active > -1:
            modelo = self.cmbTipoResultado.get_model()
            self.TipoResultado = modelo[active] [0]
                
        campos ={}
        llaves ={}

        if self.TipoResultado =='TEXTO':
            self.TipoResultado = 'T'
        else:
            self.TipoResultado = 'N'
            
        campos['descripcion_tipo_Control']=self.entDescripcion.get_text().upper()
        campos['tipo_resultado'] = self.TipoResultado
        campos['codigo_unidad'] = self.codigo_unidad
        
        if not self.editando:
            sql=ifd.insertFromDict("traza.tipo_Control", campos)
        else:
            llaves['codigo_tipo_Control']=self.entCodigo.get_text()
            sql, campos=ifd.updateFromDict("traza.tipo_Control", campos, llaves)
            
        self.cursor.execute(sql, campos)
        self.dlgTipoControl.hide()
    
    def on_btnCancelar_clicked(self, btn=None):
        self.dlgTipoControl.hide()
    
if __name__=="__main__":
    cnx=connect("dbname=vina")
    #cnx.autocommit()
    sys.excepthook=debugwindow
    w=wnTipoControl(cnx)
    
    gtk.main()
